/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Funcao;

import analiseSintatica.Regras.*;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Expressoes.RegraExpressao;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author Ivo Romário
 */
public class RegraArgsChamada extends Regra{

    protected static Regra instancia;

    protected String estrutura = "<expressao> {, <expressao>}";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraArgsChamada() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraArgsChamada getInstance() {
        if (instancia == null) {
            instancia = new RegraArgsChamada();
        }
        return (RegraArgsChamada) instancia;
    }
    

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

         ErroSintaticoException erros = new ErroSintaticoException();

         NoArvore naoTerminalArgsChamada = new NoArvore("<args_chamada>", false);

         try{
             naoTerminalArgsChamada.adicionaFilho(RegraExpressao.getInstance().analisar(listaTokens));
         }
         catch(ErroSintaticoException e){
         }

         try{
             while(listaTokens.getFirst().getToken().equals("delimitador") && listaTokens.getFirst().getLexema().equals(",")){
                 naoTerminalArgsChamada.adicionaFilho(reconheceLexema(listaTokens, "delimitador", ",",estrutura));
                 naoTerminalArgsChamada.adicionaFilho(RegraExpressao.getInstance().analisar(listaTokens));
             }
         }
         catch(ErroSintaticoException e){
         }
         
        return naoTerminalArgsChamada;
        //throw new UnsupportedOperationException("Not supported yet.");
    }

   
    @Override
    protected void setPrimeiro() {
        this.primeiro.add("(");
        this.primeiro.add("identificador");
        this.primeiro.add("numeroInteiro");
        this.primeiro.add("numeroFlutuante");
        this.primeiro.add("charconst");
        this.primeiro.add("++");
        this.primeiro.add("--");
        this.primeiro.add("&");
        this.primeiro.add("*");

        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected void setSeguinte() {
        this.seguinte.add(")");
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }

   
}
